JSON.format = formatJson = function(json, options) {
    try {
        JSON.parse(json)
    } catch (err) {
        return json
    }
    var expression;
    var formatted = '';
    var pad = 0;
    var PADDING = '  ';
    options = options || {};
    options.newlineBeforeColon = (options.newlineBeforeColon === true);
    options.spaceAfterColon = (options.spaceAfterColon !== false);
    if (typeof json !== 'string') {
        json = JSON.stringify(json)
    } else {
        json = JSON.parse(json);
        json = JSON.stringify(json)
    }
    reg = /([\{\}])/g;
    json = json.replace(reg, '\r\n$1\r\n');
    reg = /([\[\]])/g;
    json = json.replace(reg, '\r\n$1\r\n');
    reg = /(\,)/g;
    json = json.replace(reg, '$1\r\n');
    reg = /(\r\n\r\n)/g;
    json = json.replace(reg, '\r\n');
    reg = /\r\n\,/g;
    json = json.replace(reg, ',');
    if (!options.newlineBeforeColon) {
        reg = /\:\r\n\{/g;
        json = json.replace(reg, ':{');
        reg = /\:\r\n\[/g;
        json = json.replace(reg, ':[')
    }
    if (options.spaceAfterColon) {
        reg = /\:/g;
        json = json.replace(reg, ':')
    }
    (json.split('\r\n')).forEach(function(node, index) {
        var i = 0
          , indent = 0
          , padding = '';
        if (node.match(/\{$/) || node.match(/\[$/)) {
            indent = 1
        } else if (node.match(/\}/) || node.match(/\]/)) {
            if (pad !== 0) {
                pad -= 1
            }
        } else {
            indent = 0
        }
        for (i = 0; i < pad; i++) {
            padding += PADDING
        }
        formatted += padding + node + '\r\n';
        pad += indent
    });
    var data = '<pre><code class="json">' + formatted + "</code></pre>";
    if (hljs !== undefined)
        data = '<pre><code class="json">' + hljs.highlightAuto(formatted).value + "</code></pre>";
    return data
}
;
